001 /* EVolve - an Extensible Software Visualization Framework
002 * Copyright (C) 2001-2002 Qin Wang
003 *
004 * This library is free software; you can redistribute it and/or
005 * modify it under the terms of the GNU Library General Public
006 * License as published by the Free Software Foundation; either
007 * version 2 of the License, or (at your option) any later version.
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Library General Public License for more details.
013 *
014 * You should have received a copy of the GNU Library General Public
015 * License along with this library; if not, write to the
016 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
017 * Boston, MA 02111-1307, USA.
018 */
019
020 /*
021 * EVolve is distributed at http://www.sable.mcgill.ca/EVolve/
022 */
023
024 package EVolve.visualization;
025
026 import EVolve.*;
027 import EVolve.exceptions.NoDataPlotException;
028 import EVolve.data.*;
029 import EVolve.util.*;
030 import java.util.*;
031
032 public class ReferenceDimension extends Dimension implements Cloneable{
033 private ArrayList comparatorList;
034 private int currentOrder;
035 private int[] order;
036 private int [] orderBfUnify;
037 private Entity[] entity;
038 private HashSet linkedEntity;
039 private int selectedIndex;
040 private int entityNumber;
041 private HashMap Int2Entity, EntityName2Int;
042 private Sorter sorter;
043
044 public ReferenceDimension() {
045 comparatorList = new ArrayList();
046 linkedEntity = null;
047 selectedIndex = 0;
048 entityNumber = -1;
049 Int2Entity = new HashMap();
050 EntityName2Int = new HashMap();
051 orderBfUnify = null;
052 }
053
054 public int getMaxEntityNumber() {
055 return Scene.getDataManager().getEntity()[dataFilter.getTargetType()].size();
056 }
057
058 public int getEntityNumber() {
059 return entity==null ? -1 : entity.length;
060 }
061
062 public long getField(Element element) {
063 long returnVal = dataFilter.getData(element);
064 Integer mappedId = findMappedId(returnVal);
065
066 if (order[mappedId.intValue()] == Integer.MAX_VALUE) {
067 order[mappedId.intValue()] = currentOrder;
068 currentOrder++;
069 }
070 return mappedId.intValue();
071 }
072
073 public void preVisualize() {
074 currentOrder = 0;
075 EntityName2Int.clear();
076 Int2Entity.clear();
077 order = new int[getMaxEntityNumber()];
078 for (int i = 0; i < order.length; i++) {
079 order[i] = Integer.MAX_VALUE;
080 }
081 }
082
083 public void restore() {
084 order = new int[getMaxEntityNumber()];
085 for (int i = 0; i < order.length; i++) {
086 if (i<currentOrder)
087 order[i] = i;
088 else
089 order[i] = Integer.MAX_VALUE;
090 }
091 linkedEntity = null;
092
093 ArrayList tobeDel = new ArrayList();
094 Iterator it = Int2Entity.keySet().iterator();
095 while (it.hasNext()) {
096 Integer key = (Integer)it.next();
097 if (key.intValue() >= currentOrder) {
098 tobeDel.add(key);
099 }
100 }
101 for (int i=0; i<tobeDel.size(); i++) {
102 Int2Entity.remove(tobeDel.get(i));
103 }
104
105 tobeDel.clear();
106 it = EntityName2Int.keySet().iterator();
107 while (it.hasNext()) {
108 Object key = it.next();
109 Integer value = (Integer)EntityName2Int.get(key);
110 if (value.intValue() >= currentOrder) {
111 tobeDel.add(key);
112 }
113 }
114 for (int i=0; i<tobeDel.size(); i++) {
115 EntityName2Int.remove(tobeDel.get(i));
116 }
117 }
118
119 public void visualize() throws NoDataPlotException{
120
121 if (linkedEntity == null) {
122 entity = new Entity[currentOrder];
123
124 for (int i = 0; i < order.length; i++) {
125 if (order[i] != Integer.MAX_VALUE) {
126 entity[order[i]] = (Entity)Int2Entity.get(new Integer(i));
127 }
128 }
129 } else { // unified reference dimension
130 int free = currentOrder;
131 entityNumber = currentOrder;
132 entity = new Entity[linkedEntity.size()];
133
134 order = new int[linkedEntity.size()];
135 Iterator it = linkedEntity.iterator();
136 while (it.hasNext()) {
137 Entity aEntity = (Entity)it.next();
138 Integer mappedId = (Integer)EntityName2Int.get(aEntity.getName());
139 if (mappedId != null) {
140 order[mappedId.intValue()] = mappedId.intValue();
141 entity[order[mappedId.intValue()]] = aEntity;
142 } else {
143 Int2Entity.put(new Integer(free), aEntity);
144 EntityName2Int.put(aEntity.getName(), new Integer(free));
145 order[free] = Integer.MAX_VALUE;
146 entity[free] = aEntity;
147 free++;
148 }
149 }
150 }
151
152 comparatorList.clear();
153 comparatorList.add(new LexicalComparator());
154 comparatorList.add(new ValueComparator("Temporal", true, order, EntityName2Int));
155 ArrayList entityComparatorList = ((EntityDefinition)(Scene.getDataManager().getElementDefinition()[dataFilter.getTargetType()])).getComparator();
156 for (int i = 0; i < entityComparatorList.size(); i++) {
157 comparatorList.add(entityComparatorList.get(i));
158 }
159
160 sorter = new Sorter(entity, (EntityComparator)(comparatorList.get(selectedIndex)));
161
162 // we generate an exception on purpose for empty image
163 if (entity.length == 0) throw new NoDataPlotException();
164 }
165
166 public Entity getEntity(int index) {
167 int newMappedId = (sorter == null) ? index : sorter.getSource(index);
168
169 if (Int2Entity.containsKey(new Integer(newMappedId))) {
170 return (Entity)Int2Entity.get(new Integer(newMappedId));
171 }
172
173 return null;
174 }
175
176 public ArrayList getComparator() {
177 return comparatorList;
178 }
179
180 public void selectComparator(int selectedIndex) {
181 sorter = new Sorter(entity, (EntityComparator)(comparatorList.get(selectedIndex)));
182 this.selectedIndex = selectedIndex;
183 }
184
185 public void addComparator(EntityComparator comparator) {
186 boolean found = false;
187 for (int i=0; i<comparatorList.size(); i++) {
188 if (((EntityComparator)comparatorList.get(i)).getName().equals(comparator.getName()))
189 found = true;
190 }
191 if (!found) comparatorList.add(comparator);
192 }
193
194 public int getSortedIndex(int mappedId) {
195 if (order[mappedId] == Integer.MAX_VALUE) {
196 return -1;
197 } else {
198 return sorter.getTarget(order[mappedId]);
199 }
200 }
201
202 public int getOriginMappedId(int sortedId) {
203 int mappedId = sorter.getSource(sortedId);
204 return mappedId;
205 }
206
207 public void makeSelection(int sourceType, int[] selection) {
208 if (selection.length != 0) {
209 long[] selected = new long[selection.length];
210 for (int i = 0; i < selected.length; i++) {
211 selected[i] = getEntity(selection[i]).getId();
212 }
213 Scene.getFilter().addSelection(new Selection(sourceType,dataFilter.getTargetType(), selected, 0, Long.MAX_VALUE,null));
214 }
215 }
216
217 public void makeSelection(int sourceType, int[] selection, long start, long end, ArrayList timeMap) {
218 if (selection.length != 0) {
219 long[] selected = new long[selection.length];
220 for (int i = 0; i < selected.length; i++) {
221 selected[i] = getEntity(selection[i]).getId();
222 }
223 Scene.getFilter().addSelection(new Selection(sourceType, dataFilter.getTargetType(), selected, start, end, timeMap));
224 }
225 }
226
227 public Entity[] getEntities() {
228 return entity;
229 }
230
231 public void linkEntities(HashSet linkedEntity) {
232 if (this.linkedEntity != null)
233 restore();
234 this.linkedEntity = linkedEntity;
235 }
236
237 public void clearEntityMap() {
238 linkedEntity = null;
239 entity = null;
240 entityNumber = -1;
241 }
242
243 public int getSelectedComparatorIndex() {
244 return selectedIndex;
245 }
246
247 public String getSelectedComparatorName() {
248
249 return ((EntityComparator)comparatorList.get(selectedIndex)).getName();
250 }
251
252 public int[] getOrdering() {
253 if (orderBfUnify == null)
254 return order;
255 else
256 return orderBfUnify;
257 }
258
259 public void updateOrdering(int[] newOrder) {
260 if (orderBfUnify == null)
261 orderBfUnify = order;
262 order = newOrder;
263 }
264
265 public int getEntityNumberBeforeLink() {
266 return entityNumber;
267 }
268
269 public HashMap getEntityName2IntMap() {
270 return EntityName2Int;
271 }
272
273 public HashMap getInt2EntityMap() {
274 return Int2Entity;
275 }
276
277 public Entity getEntityFromInt(int mappedId) {
278 Integer key = new Integer(mappedId);
279 if (Int2Entity.containsKey(key)) {
280 return (Entity)Int2Entity.get(key);
281 } else
282 return null;
283 }
284
285 private Integer findMappedId(long entityId) {
286 Long value = new Long(entityId);
287 Entity entity = (Entity)Scene.getDataManager().getEntity()[dataFilter.getTargetType()].get(value);
288
289 if (EntityName2Int.containsKey(entity.getName())) {
290 return (Integer)EntityName2Int.get(entity.getName());
291 } else {
292 Integer mappedId = new Integer(Int2Entity.size());
293 Int2Entity.put(mappedId,entity);
294 EntityName2Int.put(entity.getName(),mappedId);
295 return mappedId;
296 }
297 }
298
299 public Object clone() {
300 ReferenceDimension o = (ReferenceDimension) super.clone();
301 o.comparatorList = (ArrayList)comparatorList.clone();
302 o.comparatorList.clear();
303 for (int i=0; i<comparatorList.size(); i++) {
304 o.comparatorList.add(((EntityComparator)comparatorList.get(i)).clone());
305 }
306 o.entity = null;
307 if (entity != null) {
308 o.entity = new Entity[entity.length];
309 for (int i=0; i<o.entity.length; i++)
310 o.entity[i] = entity[i];
311 }
312 o.linkedEntity = HelperFuncs.cloneHashSet(linkedEntity);
313 o.Int2Entity = HelperFuncs.cloneHashMap(Int2Entity);
314 o.EntityName2Int = HelperFuncs.cloneHashMap(EntityName2Int);
315
316 o.order = null;
317 if (order != null) {
318 o.order = new int[order.length];
319 for (int i=0; i<order.length; i++) {
320 o.order[i] = order[i];
321 }
322 }
323
324 o.sorter = (sorter == null) ? null : (Sorter)sorter.clone();
325 return o;
326 }
327 }